/**
 * 格式化日期
 * @param {Date|String|Number} date 日期对象/日期字符串/时间戳
 * @param {String} format 格式化模式，默认 'YYYY-MM-DD HH:mm:ss'
 * @returns {String} 格式化后的日期字符串
 */
export const formatDate = (date, format = 'YYYY-MM-DD HH:mm:ss') => {
  if (!date) return ''
  
  let dt = date
  if (typeof date === 'string') {
    dt = new Date(date.replace(/-/g, '/'))
  } else if (typeof date === 'number') {
    dt = new Date(date)
  }
  
  const year = dt.getFullYear()
  const month = dt.getMonth() + 1
  const day = dt.getDate()
  const hour = dt.getHours()
  const minute = dt.getMinutes()
  const second = dt.getSeconds()
  
  return format
    .replace(/YYYY/g, year)
    .replace(/MM/g, month < 10 ? '0' + month : month)
    .replace(/DD/g, day < 10 ? '0' + day : day)
    .replace(/HH/g, hour < 10 ? '0' + hour : hour)
    .replace(/mm/g, minute < 10 ? '0' + minute : minute)
    .replace(/ss/g, second < 10 ? '0' + second : second)
}

/**
 * 格式化金额
 * @param {Number} money 金额
 * @param {Number} decimals 小数位数，默认2位
 * @param {Boolean} thousands 是否添加千位分隔符，默认false
 * @returns {String} 格式化后的金额字符串
 */
export const formatMoney = (money, decimals = 2, thousands = false) => {
  if (isNaN(money)) return '0.00'
  
  const num = parseFloat(money)
  const options = {
    minimumFractionDigits: decimals,
    maximumFractionDigits: decimals
  }
  
  if (thousands) {
    options.style = 'currency'
    options.currency = 'CNY'
  }
  
  return num.toLocaleString('zh-CN', options)
}

/**
 * 防抖函数
 * @param {Function} fn 需要防抖的函数
 * @param {Number} delay 延迟时间，默认500ms
 * @returns {Function} 防抖后的函数
 */
export const debounce = (fn, delay = 500) => {
  let timer = null
  
  return function(...args) {
    if (timer) clearTimeout(timer)
    
    timer = setTimeout(() => {
      fn.apply(this, args)
    }, delay)
  }
}

/**
 * 节流函数
 * @param {Function} fn 需要节流的函数
 * @param {Number} delay 延迟时间，默认500ms
 * @returns {Function} 节流后的函数
 */
export const throttle = (fn, delay = 500) => {
  let lastTime = 0
  
  return function(...args) {
    const now = Date.now()
    
    if (now - lastTime >= delay) {
      fn.apply(this, args)
      lastTime = now
    }
  }
}

/**
 * 获取文件扩展名
 * @param {String} filename 文件名
 * @returns {String} 文件扩展名
 */
export const getFileExt = (filename) => {
  if (!filename) return ''
  return filename.substring(filename.lastIndexOf('.') + 1).toLowerCase()
}

/**
 * 检查文件类型是否合法
 * @param {String} filename 文件名
 * @param {Array} allowTypes 允许的文件类型数组
 * @returns {Boolean} 是否合法
 */
export const checkFileType = (filename, allowTypes = ['jpg', 'jpeg', 'png', 'pdf']) => {
  const ext = getFileExt(filename)
  return allowTypes.includes(ext)
}

/**
 * 获取随机字符串
 * @param {Number} length 字符串长度，默认16
 * @returns {String} 随机字符串
 */
export const randomString = (length = 16) => {
  const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
  let result = ''
  
  for (let i = 0; i < length; i++) {
    result += chars.charAt(Math.floor(Math.random() * chars.length))
  }
  
  return result
} 